package main

import (
	"fmt"
	"strconv"

	"github.com/xuri/excelize/v2"
)

type ExcelRequest struct {
	//http返回的下载文件名
	FileName string `json:"fileName"`
	//程序使用的模板全路径
	TemplateName string `json:templateName`
	//包含图片的列，如第三列包含图片，则为[3]
	Pics map[string][]string `json:pics`
	//请求的excel数据
	Data          map[string][]map[string]interface{} `json:data`
	SaveLocalPath string                              `json:"saveLocalPath"`
}

// 1 A 2 B ...Z
func getLetter(n int) rune {
	return rune('A' + n)
}

func Export(excelRequest *ExcelRequest) (f *excelize.File, err error) {
	data := excelRequest.Data

	//excel模板中第一行及第二行为标题，第三行为数据格式，第四行为数据模板
	templateName := excelRequest.TemplateName
	f, err = excelize.OpenFile(templateName)
	if err != nil {
		return nil, fmt.Errorf("打开模板" + templateName + "失败!," + err.Error())
	}

	for _, sheetName := range f.GetSheetList() {
		var templateRow []string
		rows, err := f.GetRows(sheetName)
		if err != nil {
			return nil, fmt.Errorf("读取sheet" + sheetName + "失败!" + err.Error())
		}
		row_3 := rows[3]
		for _, c := range row_3 {
			templateRow = append(templateRow, c)
		}
		sheetData := data[sheetName]
		//保存第三行的格式
		var styles []int
		for i := 0; i <= 26; i++ {
			style, err := f.GetCellStyle(sheetName, "A"+strconv.Itoa(i+1))
			if err != nil {
				return nil, fmt.Errorf("读取" + "A" + strconv.Itoa(i+1) + "格式失败!" + err.Error())
			}
			styles = append(styles, style)
		}
		// dataLength := len(sheetData)
		// //将第三行数据格式，向下复制dataLength次(为了将数据格式复制下去)
		// for i := 0; i < dataLength; i++ {
		// 	destRow := 3 + i
		// 	err := f.SetSheetRow(sheetName, fmt.Sprintf("A%d", destRow), &rows[0])
		// 	if err != nil {
		// 		return nil, fmt.Errorf(fmt.Sprintf("向下复制第三行到第%d失败!", destRow) + err.Error())
		// 	}
		// }
		rowIndex := 3
		for _, rowData := range sheetData {
			for i, key := range templateRow {
				cellPos := fmt.Sprintf("%c%d", getLetter(i), rowIndex)
				if err != nil {
					return nil, fmt.Errorf(fmt.Sprintf("读取excel第%d行的第%s列失败!") + err.Error())
				}
				f.SetCellValue(sheetName, cellPos, rowData[key])
				f.SetCellStyle(sheetName, cellPos, cellPos, styles[i])
			}
			rowIndex = rowIndex + 1
		}

		//插入图片
		if excelRequest.Pics != nil && len(excelRequest.Pics) != 0 {
			err := Pic(excelRequest, f, sheetName, templateRow)
			if err != nil {
				return f, err
			}
		}
	}

	return f, nil
}
